코딩테스트 연습 - 이상한 문자 만들기 | 프로그래머스 스쿨

[ 템플릿 코드 ]

#include <string>
#include <vector>
 
using namespace std;
 
string solution(string s) {
    string answer = "";
    return answer;
}

[ 풀이 ]

#include <string>
#include <vector>
 
using namespace std;
 
string solution(string s)
{
    int count = 0;
 
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] == ' ')
        {
            count = 0;
        }
        else
        {
            if(count % 2 == 0)
            {
                if(s[i] >= 'a' && s[i] <= 'z')
                    s[i] -= 32;
            }
            else
            {
                if(s[i] >= 'A' && s[i] <= 'Z')
                    s[i] += 32;
            }
 
            count++;
        }
    }
 
    return s;
}

[ 해설 ]

#include <string>  // string 자료형 사용
#include <vector>  // 현재 코드에서는 사용하지 않음
 
using namespace std; // std::string, std::vector 등을 std 없이 사용
 
string solution(string s)
{
    int count = 0; // 현재 단어에서 몇 번째 문자인지 저장
                   // 공백을 만나면 다시 0으로 초기화
 
    // 문자열의 처음부터 끝까지 반복
    for(int i = 0; i < s.size(); i++)
    {
        // 현재 문자가 공백인지 확인
        if(s[i] == ' ')
        {
            count = 0; // 새로운 단어가 시작되므로 인덱스 초기화
        }
        else
        {
            // 현재 단어에서 짝수 번째 문자라면
            if(count % 2 == 0)
            {
                // 현재 문자가 소문자인지 확인
                if(s[i] >= 'a' && s[i] <= 'z')
                    s[i] -= 32; // 소문자를 대문자로 변환
            }
            else // 현재 단어에서 홀수 번째 문자라면
            {
                // 현재 문자가 대문자인지 확인
                if(s[i] >= 'A' && s[i] <= 'Z')
                    s[i] += 32; // 대문자를 소문자로 변환
            }
 
            // 공백이 아닌 문자를 처리했으므로
            // 현재 단어의 문자 순서를 1 증가
            count++;
        }
    }
 
    // 변환이 완료된 문자열 반환
    return s;
}

[ 타 답안 ]

#include <string>      // string(문자열) 자료형을 사용하기 위한 헤더 파일
using namespace std;   // std::string 대신 string처럼 std::를 생략해서 사용
 
string solution(string s) {
 
    int idx = 0;       // 현재 단어에서 몇 번째 문자인지 저장하는 변수
                       // 단어가 바뀌면 다시 0부터 시작
 
    // 문자열 s의 문자를 처음부터 끝까지 하나씩 꺼내서 c에 저장
    // auto : 자료형을 자동으로 추론 (여기서는 char)
    // & : 참조(Reference), c를 수정하면 원본 문자열 s도 함께 수정됨
    for(auto& c : s) {
 
        // idx & 1
        // -> idx가 홀수이면 1(true)
        // -> idx가 짝수이면 0(false)
        //
        // 삼항 연산자
        // 조건 ? 참일때 : 거짓일때
        //
        // idx가 홀수면 tolower(c) 실행
        // -> 현재 문자를 소문자로 변경
        //
        // idx가 짝수면 toupper(c) 실행
        // -> 현재 문자를 대문자로 변경
        //
        // 변경된 문자를 다시 c에 저장
        c = idx & 1 ? tolower(c) : toupper(c);
 
        // 현재 문자가 공백인지 확인
        //
        // 공백이라면
        // -> 다음 문자는 새로운 단어의 첫 글자
        // -> idx를 0으로 초기화
        //
        // 공백이 아니라면
        // -> 현재 단어의 다음 문자로 이동
        // -> idx를 1 증가
        //
        // 삼항 연산자 형태
        // 조건 ? 참일때값 : 거짓일때값
        idx = c == ' ' ? 0 : idx + 1;
    }
 
    // 변환이 완료된 문자열 반환
    return s;
}

C++ CodingTest